package com.qdlc.p2p.biz.service;

import java.util.List;

import org.apache.log4j.Logger;

import com.qdlc.p2p.common.core.ReturnResult;
import com.qdlc.p2p.common.util.LogFactory;
import com.qdlc.p2p.dal.common.SystemConfigHelper;
import com.qdlc.p2p.dal.dto.TppTradeLog;

/**
 * 代收 代付 服务类
 * <p/>
 * 1. 订单创建
 * 2. 回调处理
 *
 * @author wuaj
 */
public interface CollectPayService {

    /** 交易Log */
    Logger logger = LogFactory.TRADE_LOGGER;

    /** 网址地址 */
    String WEB_URL = SystemConfigHelper.getValue(SystemConfigHelper.Nid.WEB_URL);

    /** 平台商户号 */
    String MERCHANT_ID = SystemConfigHelper.getValue(SystemConfigHelper.Nid.MERCHANT_ID);

    /**
     * 回调地址
     */
    String getCallBackUrl();

    /**
     * 取得业务名
     */
    String getBusinessName();

    /**
     * 取得订单生成必要参数
     */
    TppTradeLog getTppTradeLog();

    /**
     * 参数解析
     */
    void analyzePars(Object... pars);

    /**
     * 批量生成订单
     *
     * @param pars 生成订单 必要参数
     */
    List<TppTradeLog> createOrders(Object... pars);

    /**
     * 生成单个订单 前置处理
     */
    boolean preCreateOrder();

    /**
     * 生成单个订单
     *
     * @param pars 生成订单 必要参数
     */
    TppTradeLog createOrder(Object... pars);

    /**
     * 生成单个订单 后置处理
     */
    void aftCreateOrder(TppTradeLog tppTradeLog);

    /**
     * 订单请求成功
     *
     * @param tppTradeLog 交易Log
     */
    void requestOrderSuccess(TppTradeLog tppTradeLog);

    /**
     * 请求订单
     */
    ReturnResult requestOrder(TppTradeLog tppTradeLog);

    /**
     * 订单请求失败
     *
     * @param tppTradeLog 交易Log
     */
    void requestOrderFail(TppTradeLog tppTradeLog);

    /**
     * 交易完成
     *
     * @param tppTradeLog   交易Log
     * @param depositStatus 交易状态
     * @param tradeAmount   交易金额
     */
    void tradeFinish(TppTradeLog tppTradeLog, String depositStatus, double tradeAmount);

    /**
     * 交易成功
     *
     * @param tppTradeLog   交易Log
     * @param depositStatus 交易状态
     */
    void tradeSuccess(TppTradeLog tppTradeLog, String depositStatus);

    /**
     * 交易失败
     */
    void tradeFail(TppTradeLog tppTradeLog, String depositStatus);

}
